package com.sojson.project.sys.menu.service;

import java.io.IOException;
import java.util.List;
import java.util.Set;

import com.baomidou.mybatisplus.extension.service.IService;
import com.sojson.project.sys.menu.entity.bo.RouterBo;
import com.sojson.project.sys.menu.entity.bo.TreeSelect;
import com.sojson.project.sys.menu.entity.dto.MenuDto;
import com.sojson.project.sys.menu.entity.dto.MenuPageDto;
import com.sojson.project.sys.menu.entity.po.Menu;
import com.sojson.project.sys.menu.entity.vo.MenuVo;

/**
 * 菜单权限表Service
 * 
 * @author liu
 * @date 2022-09-08
 */
public interface MenuService extends IService<Menu> {

    /**
     * 单条插入
     * 
     * @param dto
     * @return
     * @throws IOException 
     */
    boolean add(Menu dto) throws IOException;

    /**
     * 通过id更新
     * 
     * @param dto
     * @return
     * @throws IOException 
     */
    boolean update(Menu dto) throws IOException;

    /**
     * 列表查询
     * 
     * @param dto
     * @return
     */
    List<MenuVo> list(MenuDto dto);

    /**
     * 分页查询
     * 
     * @param dto
     * @return
     */
    List<MenuVo> page(MenuPageDto dto);

    /**
     * 通过id查询
     * 
     * @param id
     * @return
     */
    MenuVo findById(String id);

    /**
     * 通过对象删除
     * 
     * @param dto
     * @return
     */
    boolean removeByDto(MenuDto dto);

    /**
     * 通过id删除
     * 
     * @param parentIds
     * @return
     * @throws IOException 
     */
    boolean removeById(String parentIds) throws IOException;

    /**
     * 清空数据
     * 
     * @return
     */
    boolean clear();

    /**
     * 通过id修改状态
     * 
     * @param dto
     * @throws IOException 
     */
    boolean updateStatus(Menu dto) throws IOException;

    /**
     * 根据用户ID查询菜单树信息
     *
     * @param dto
     * @return 菜单列表
     */
    List<MenuVo> getMenuTreeByUserId(MenuDto dto);

    /**
     * 构建前端路由所需要的菜单
     *
     * @param menus 菜单列表
     * @return 路由列表
     */
    List<RouterBo> buildMenus(List<MenuVo> menus);

    /**
     * 根据用户查询系统菜单列表
     *
     * @param dto  菜单信息
     * @return 菜单列表
     */
    List<MenuVo> selectMenuList(MenuDto dto);

    /**
     * 构建前端所需要下拉树结构
     *
     * @param menus 菜单列表
     * @return 下拉树结构列表
     * @throws IOException 
     */
    List<TreeSelect> buildMenuTreeSelect(List<MenuVo> menus) throws IOException;

    /**
     * 构建前端所需要树结构
     *
     * @param menus 菜单列表
     * @return 树结构列表
     * @throws IOException 
     */
    List<MenuVo> buildMenuTree(List<MenuVo> menus) throws IOException;

    /**
     * 根据用户查询系统菜单列表
     *
     * @param userId 用户ID
     * @return 菜单列表
     */
    List<MenuVo> selectMenuList(String userId);

    /**
     * 根据角色ID查询菜单树信息
     *
     * @param roleId 角色ID
     * @return 选中菜单列表
     */
    List<String> selectMenuListByRoleId(String roleId);

    /**
     * 获取超级管理员角色数量
     * 
     * @param userIds
     * @return
     */
    int getAdminSuperRoleNumByUserIds(List<String> userIds);

    /**
     * 获取超级管理员角色数量
     * 
     * @param roleIds
     * @return
     */
    int getAdminSuperRoleNumByRoleIds(Set<String> roleIds);

}